
#ifndef HASHMANAGER_H_
#define HASHMANAGER_H_

#include "HashTable.h"
#include "../../CapaFisica/ArchivoDeBloques.h"

class HashManager {
private:
	std::string pathBloque;
	std::string pathTabla;
	int sizeBloque;
	ArchivoDeBloques* filebuckets;
	HashTable* hashTable;

	/**
	 * Redispersa el bloque.
	 */
	void redispersar(Bloque* bloque, int idBloque, Bloque* bloqueNuevo, int idBloqueNuevo, Registro* registro);

public:
	HashManager(std::string pathBloque, std::string pathTabla, int sizeBloque);
	~HashManager();

	/**
	 * Agrega el registro al hash en el bloque y offset solicitado.
	 */
	bool agregarRegistro(Registro* registro, Bloque* bloque, int offset);

	/**
	 * Agrega el registro al hash.
	 */
	bool agregarRegistro(Registro* registro);

	/**
	 * Busca el registro con la clave solicitada.
	 * Si el registro se encuentra es copiado en la referencia pasada por parametro.
	 */
	bool buscarRegistro(int clave, Registro* registro);

	/**
	 * Modifica el registro pasado por parametro.
	 * Retorna true si lo pudo modificar.
	 */
	bool modificarRegistro(Registro* registro);

	/**
	 * Elimina el registro con la clave pasada por parametro.
	 * Retorna true si lo pudo eliminar.
	 */
	bool eliminarRegistro(int clave);
};

#endif /* HASHMANAGER_H_ */
